package com.zhuhao.utils;

import cn.hutool.core.codec.Base64Decoder;
import cn.hutool.core.codec.Base64Encoder;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 对图片url进行base64编码，编码后还原
 *
 * @Author zhuhao
 * @Date 2022/1/24 14:11
 * @desc
 */
@Slf4j
public class ImgBase64Utils {

    /**
     * 将网络图片编码为base64
     *
     * @param imgUrl
     * @return *@throws BusinessException
     */
    public static String encodeImageToBase64(String imgUrl) {

        //打开链接
        HttpURLConnection conn = null;
        String base64 = null;
        try {
            URL url = new URL(imgUrl);
            conn = (HttpURLConnection) url.openConnection();
            //设置请求方式为"GET"
            conn.setRequestMethod("GET");
            //超时响应时间为5秒
            conn.setConnectTimeout(5 * 1000);
            //通过输入流获取图片数据
            InputStream inStream = conn.getInputStream();
            //得到图片的二进制数据，以二进制封装得到数据，具有通用性
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            //创建一个Buffer字符串
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度，如果为-1，代表全部读取完毕
            int len = 0;
            //使用一个输入流从buffer里把数据读取出来
            while ((len = inStream.read(buffer)) != -1) {
                //用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度
                outStream.write(buffer, 0, len);
            }
            //关闭输入流
            inStream.close();
            byte[] data = outStream.toByteArray();
            //对字节数组Base64编码
            base64 = Base64Encoder.encode(data);
        } catch (IOException e) {
            log.info("获取图片转码失败", e);
        }
        //返回Base64编码过的字节数组字符串
        return base64;
    }


    public static void main(String[] args) throws IOException {

        String s = encodeImageToBase64("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fim1.tongbu.com%2Fappicon%2Fapp%2F141%2F41%2F10002141_DBB0955C.jpg&refer=http%3A%2F%2Fim1.tongbu.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1645769079&t=461950bac9ea2b073aea81f88433fae8");
        System.out.println(s);

        boolean b = generateImage(s, "D:/dd.jpg");
    }

    /**
     * base64字符串转化成图片
     *
     * @param imgData
     * @param imgFilePath
     * @return
     * @throws IOException
     */
    @SuppressWarnings("finally")
    public static boolean generateImage(String imgData, String imgFilePath) throws IOException {
        // 图像数据为空
        if (imgData == null) {
            return false;
        }
        OutputStream out = null;
        try {
            out = new FileOutputStream(imgFilePath);
            // Base64解码
            byte[] b = Base64Decoder.decode(imgData);
            for (int i = 0; i < b.length; ++i) {
                // 调整异常数据
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }
            out.write(b);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            out.flush();
            out.close();
        }
        return true;
    }
}
